﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Prob_Distributions_ClassLibrary
{
    public class DistributionController : IDistribucion
    {
        private IDistribucion distribucion;
        private int tipoDistribucion;
        private List<decimal> lstIntervals = new List<decimal>();
        private List<int> lstFrecuency = new List<int>();

        public DistributionController(int distribucion, RandomNumber rnd, Hashtable parametros)
        {
            this.tipoDistribucion = distribucion;
            
            switch (distribucion)
            {
                case (int) Utils.distribucion.ExponencialNegativo:
                    this.distribucion = new DistribucionExponencialNegativa(double.Parse(parametros["promedio"].ToString()), rnd);
                    break;
                case (int)Utils.distribucion.Uniforme:
                    this.distribucion = new DistribucionUniforme(rnd,double.Parse(parametros["limInf"].ToString()), double.Parse(parametros["limSup"].ToString()));
                    break;
                case (int)Utils.distribucion.Normal:
                    this.distribucion = new DistribucionNormal(rnd, double.Parse(parametros["promedio"].ToString()), double.Parse(parametros["desviacion"].ToString()));
                    break;
                case (int)Utils.distribucion.Poisson:
                    this.distribucion = new DistribucionPoisson(rnd, double.Parse(parametros["promedio"].ToString()));
                    break;
                default:
                    Console.WriteLine("Default case");
                    break;
            }                                   
        }

        public List<double> getNRandoms(int cant)
        {
            return distribucion.getNRandoms(cant);
        }
        public decimal getMayor()
        {
            return distribucion.getMayor();        
        }
        public decimal getMenor()
        {
            return distribucion.getMenor();
        }
        public decimal getIntervalo(int intervalos)
        {
            return distribucion.getIntervalo(intervalos);
        }
        public List<decimal> getLstIntervals(int intervalos)
        {
            lstIntervals = new List<decimal>();
            lstFrecuency = new List<int>();
            decimal intervalo= distribucion.getIntervalo(intervalos);
            for (int i = 0; i < intervalos; i++)
            {
                if (i == 0)
                    lstIntervals.Add((decimal)distribucion.getLimiteInferior() + intervalo);
                else
                    lstIntervals.Add((decimal)lstIntervals[i - 1] + intervalo);
                lstFrecuency.Add(0);
            }
            return lstIntervals;                    
        }
        public List<int> getLstFrecuency(List<double>lstRandoms)
        {            
            int posicion;

            for (int j = 0; j < lstRandoms.Count; j++)
            {
                posicion = 0;

                for (int k = 0; k < lstIntervals.Count; k++)
                {
                    if ((decimal)lstRandoms[j] > lstIntervals[k])
                        posicion++;
                }
                if (posicion < lstFrecuency.Count)
                    lstFrecuency[posicion] = lstFrecuency[posicion] + 1;
            }
            return lstFrecuency;

        }
        public double getLimiteSuperior()
        {
            return distribucion.getLimiteSuperior();
        }
        public double getLimiteInferior()
        {
            return distribucion.getLimiteInferior();
        }        
    }
}
